package com.itheima.d10_parse_annotation.Demo01;

import org.junit.Test;

import java.lang.reflect.Method;
import java.util.Arrays;

/*
需求：注解解析的案例
分析
定义注解BookInfo，要求如下：
        
- 包含属性：String value()   书名
        - 包含属性：double price()  价格，默认值为 100
        - 包含属性：String[] authors() 多位作者
        - 限制注解使用的位置：类和成员方法上
        - 指定注解的有效范围：RUNTIME
定义BookStore类，在类和成员方法上使用BookInfo注解
定义AnnotationDemo01测试类获取BookInfo注解上的数据

 */
public class Demo01 {
    @Test
    public void parseAnnotation() throws NoSuchMethodException {
        //解析BookStore上的注解，把注解中的信息解析出来

        //如果要拿类型上的注解，需要想先拿到字节码对象
        //1、先获取字节码对象
        Class<BookStore> cls = BookStore.class;
        //2、判断类型上是否有BookInfo注解
        if (cls.isAnnotationPresent(BookInfo.class)) {
            //有注解，解析
            BookInfo bookInfo = cls.getDeclaredAnnotation(BookInfo.class);
            //获取信息
            String name = bookInfo.value();
            double price = bookInfo.price();
            String[] authors = bookInfo.authors();
            System.out.println(name + " : " + price + " : " + Arrays.toString(authors));
        }


        //解析方法上的注解
        //1、拿到方法对象
        Method sellMethod = cls.getDeclaredMethod("sell");
        //2、判断有没有注解，有注解就解析
        if (sellMethod.isAnnotationPresent(BookInfo.class)) {
            //有注解，解析
            BookInfo bookInfo = sellMethod.getDeclaredAnnotation(BookInfo.class);
            //获取信息
            String name = bookInfo.value();
            double price = bookInfo.price();
            String[] authors = bookInfo.authors();
            System.out.println(name + " : " + price + " : " + Arrays.toString(authors));
        }
    }
}
